package com.zhangfei.product.server.grpc;

import com.zhangfei.product.biz.assember.ProductServerAssembler;
import com.zhangfei.product.biz.domain.dto.ProductInfoDTO;
import com.zhangfei.product.biz.manager.ProductManager;
import com.zhangfei.product.proto.product1.ProductServer;
import com.zhangfei.product.proto.product1.ProductServiceGrpc;
import io.grpc.stub.StreamObserver;
import net.devh.boot.grpc.server.service.GrpcService;

import javax.annotation.Resource;

@GrpcService
public class ProductGrpcServer extends ProductServiceGrpc.ProductServiceImplBase {

    @Resource
    private ProductManager productManager;


    @Resource
    private ProductServerAssembler productServerAssembler;

    /**
     * 我们重写的是ProductServiceGrpc.ProductServiceImplBase中的queryProduct方法，所以参数必须是这样的
     * 有的公司做了封装，所以我们有时候会看到有的人写的接口是不一样的，但是原生的必须这样写。
     * @param request
     * @param responseObserver
     */

    @Override
    public void queryProduct(ProductServer.QueryProductRequest request, StreamObserver<ProductServer.QueryProductResponse> responseObserver) {
        //1.获取参数
        String productId=  productServerAssembler.convertGrpcToDto(request);


        //2.manager处理逻辑
        ProductInfoDTO productInfoDTO = productManager.queryProduct(productId);

        //3.响应组装
        ProductServer.ProductInfo productInfo = productServerAssembler.convertTDtoTOGrpc(productInfoDTO);


        //4、构建返回值，这个可以写一个工具封装一下，这里不写了，方便大家了解原生语法
        ProductServer.QueryProductResponse response = ProductServer.QueryProductResponse.newBuilder()
                .setCode(200)
                .setMessage("")
                .setData(productInfo)
                .build();
        responseObserver.onNext(response);
        responseObserver.onCompleted();
    }


}
